package com.xuelang.pipeline.client.pipeline.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * <p>流水线实例DTO</p>
 *
 * @author : yixin.lys
 * @date : 2024-06-18 18:03
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class PipelineInstanceDTO {

    /**
     * 主键，自增
     */
    private Integer id;

    /**
     * 实例编号
     */
    private String instanceCode;

    /**
     * 应用编码
     */
    private String applicationCode;

    /**
     * 组件编码
     */
    private String componentCode;

    /**
     * 组件唯一标识
     */
    private String componentLabel;

    /**
     * 构建号，从1开始步长为1递增
     */
    private Integer buildNumber;

    /**
     * 流水线编码
     */
    private String pipelineCode;

    /**
     * 流水线名字
     */
    private String pipelineName;

    /**
     * 流水线状态，1运行中，2成功，3失败，4终止
     */
    private String pipelineStatus;

    /**
     * 触发方式，1手动触发，2定时触发
     */
    private Integer triggerType;

    /**
     * 触发方式显示文本
     */
    private String triggerTypeDisplayStr;

    /**
     * 全局变量
     */
    private String contextInfo;

    /**
     * 开始时间
     */
    private Date startTime;

    /**
     * 结束时间
     */
    private Date endTime;

    /**
     * 创建人
     */
    private String creatorId;

    /**
     * 创建人名称
     */
    private String creator;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 更新人ID
     */
    private String updaterId;

    /**
     * 更新时间
     */
    private Date updateTime;

    /**
     * 触发人
     */
    private String operator;

    /**
     * 持续时间
     */
    private String duration;

    /**
     * 运行备注
     */
    private String remark;

    /**
     * 根据startTime和endTime计算得出时间差duration（时分秒），若startTime和endTime任何一个为null，则不计算
     *
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 持续时间（时分秒），如果startTime或endTime为null，则返回null
     */
    public static String calculateDuration(Date startTime, Date endTime) {
        if (startTime == null || endTime == null) {
            return null;
        }

        long durationInMillis = endTime.getTime() - startTime.getTime();
        long hours = TimeUnit.MILLISECONDS.toHours(durationInMillis);
        long minutes = TimeUnit.MILLISECONDS.toMinutes(durationInMillis) % 60;
        long seconds = TimeUnit.MILLISECONDS.toSeconds(durationInMillis) % 60;

        StringBuilder duration = new StringBuilder();
        if (hours > 0) {
            duration.append(hours).append("时");
        }
        if (minutes > 0 || hours > 0) {  // If hours > 0, we should show minutes even if it's 0
            duration.append(minutes).append("分");
        }
        duration.append(seconds).append("秒");

        return duration.toString();
    }
}
